﻿//第一天：搭mccj的骨架

(function (window,undefined){
	
	var document=window.document,
	navigator=window.navigator,
	location=window.location;	
	
	var mccj=(function (){
		var _mccj=window.mccj,
		rootmccj;
		
		// 定义一个mccj的本地副本，局部变量
		var mccj=function (selector,context){
			return new mccj.fn.init(selector,context,rootmccj);
		},
		
		//保存一些JS核心方法的引用，下面会经常用到这些方法
		toString = Object.prototype.toString ,
		//##142，Object的原型方法，是用来判断一个对象是否有你给出名称的属性或对象。详解参见：http://kevinpeng.iteye.com/blog/766755或http://www.cnblogs.com/jenry/archive/2010/12/08/1900150.html
		hasOwn = Object.prototype.hasOwnProperty ,
		//##143，数组的原型方法，向数组的末尾添加一个或更多元素，并返回新的长度。详解参见：http://www.iteye.com/topic/764850
		push = Array.prototype.push ,
		//##144，数组的原型方法，从某个已有的数组中截取数组中的一部分，并返回一个新数组，通常用它来复制数组。详解参见：http://www.iteye.com/topic/764850
		slice=Array.prototype.slice,
		//##148，String的原型方法，用于去除字符串的头尾空格。注意：String类型本身并没有trim方法，但允许客户端用户自定义添加原型trim方法。
		trim=String.prototype.trim,
		//##151，Array的原型方法，用于搜索数组中元素。注意：Array类型本身并没有indexOf方法，但允许客户端用户自定义添加原型indexOf方法。
		indexOf=Array.prototype.indexOf;
		
		/**
		 * 此处可以继续声明并初始化别的局部变量。
		 * 示例：var _mccj=window.mccj,trimLeft=/^\s+/;等
		 */
		
		
		/**
		 * 重要：定义mccj的原型
		 */
		mccj.fn=mccj.prototype={
			
			//定义构造器调用的函数，其实还是调用了下面的init方法，见#11行的定义
			constructor :mccj,
			
			/**
			 * @param {Object} selector 选择器
			 * @param {Object} context 上下文
			 * @param {Object} rootmccj 父节点
			 */
			init:function (selector,context,rootmccj){
				return this;
			},
			
			// 初始化
			selector:"",
			
			// 当前使用的mccj版本
			version:"1.0.0"
			
		};		
		
		/**
		 * 判断参数obj是否为数字
		 */
		mccj.isNaN=function (obj){
			return (!!obj)||isNaN(obj);
		};
		
		/**
		 * 生成正则表达式，支持模糊匹配
		 * 用法示例：匹配含有“abc”的字符
		 * <pre>
		 		var regStr = getRegExp("abc");//获得正则表达式的字符串
		 		if(regStr==null||regStr.trim()=="") return true;
				var reg=new RegExp(regStr,"i");//正则表达式
				if(reg.test("cba123abc321")==true){
					return true;//匹配成功
				}else{
					return false;//匹配失败
				}
		 * </pre>
		 */
		mccj.getRegExp=function (str){
			if(str==null||str.trim()=="") return null;
			var myreg = str.replace(/[\(|\)|\[|\]|\{|\}|\\|\/|\^|\$|\||\?|\+]+/gi, "*");//清除正则表达式的元字符(但保留元字符*)
			myreg=myreg.replace(/%+/gi, "");//清除所有%
			myreg=myreg.replace(/(^\s*)|(\s*$)/gi, "");//清除前后空格
			if(myreg.trim()=="") return null;
			myreg=myreg.replace(/\s/gi, "*");//替换中间的所有空格为*
			myreg=myreg.replace(/(^\**)|(\**$)/gi, "");//清除前后的*
			myStr=myreg.replace(/\*+/gi, "*");//替换所有连续的*为单个*
			myreg=myreg.replace(/\*+/gi, "+");//替换所有连续的*为单个+
			myreg="[\\s|\\S]*("+myreg;//在前加上[]字符
			myreg=myreg.replace(/\++/gi, ")+[\\s|\\S]*(");//替换中间所有的*为]*[
			myreg=myreg+")+[\\s|\\S]*"//在后加上]*字符
			//alert("生成的正则表达式为：【"+myreg+"】");
			return myreg;
		};
		
		// Give the init function the mccj prototype for later instantiation
		mccj.fn.init.prototype=mccj.fn;
		
		return mccj;
		
	})();
	
	// 将mccj设置为Global全局对象
	window.mccj=mccj;
	if(!window.mcj){//若全局中未存在mcj，则mcj是mccj的别名，即此时使用mcj等同于使用mccj
		window.mcj = mccj;
	}
	if(!window.mj$){//若全局中未存在mj$，则mj$是mccj的别名，即此时使用mj$等同于使用mccj
		window.mj$ = mccj;
	}
	if(!window.m$){//若全局中未存在m$，则m$是mccj的别名，即此时使用m$等同于使用mccj
		window.m$ = mccj;
	}
	if(!window.$){//若全局中未存在$，则$是mccj的别名，即此时使用$等同于使用mccj
		window.$ = mccj;
	}
	
})(window);
